#include "LiteBsp.h"

// start：已经在hal层驱动初始化，此处仅作记录
// end：已经在hal层驱动初始化，此处仅作记录
  
//--> 导入外部变量
#ifdef __DMA_H__
extern DMA_HandleTypeDef hdma_uart4_tx;     //  有资源竞争，需互斥锁(网络)
extern DMA_HandleTypeDef hdma_uart4_rx;     //  无资源竞争
extern DMA_HandleTypeDef hdma_usart2_tx;    //  有资源竞争，需互斥锁(打印)
extern DMA_HandleTypeDef hdma_usart2_rx;    //  无资源竞争
#endif
//--> 导入外部变量

#define BUFSIZE_TX2 128          //  一次发送最大字节数
#define BUFSIZE_RX2 128          //  一次接收最大字节数
#define BUFSIZE_TX4 128          //  一次发送最大字节数
#define BUFSIZE_RX4 128          //  一次接收最大字节数

UART_T   g_tUart2;        //  ESP32模块串口
UART_T   g_tUart4;        //  调试串口

static u8       s_ucaBufTx2[BUFSIZE_TX2];  //  头指针：发送缓冲区2 
static u8       s_ucaBufRx2[BUFSIZE_RX2];  //  头指针：接收缓冲区2 
static u8       s_ucaBufTx4[BUFSIZE_TX4];  //  头指针：发送缓冲区4 
static u8       s_ucaBufRx4[BUFSIZE_RX4];  //  头指针：接收缓冲区4

static BUFFER_T BufTx2 = {s_ucaBufTx2,BUFSIZE_TX2,0};    // 缓冲区结构体
static BUFFER_T BufRx2 = {s_ucaBufRx2,BUFSIZE_RX2,0};    // 缓冲区结构体
static BUFFER_T BufTx4 = {s_ucaBufTx4,BUFSIZE_TX4,0};    // 缓冲区结构体
static BUFFER_T BufRx4 = {s_ucaBufRx4,BUFSIZE_RX4,0};    // 缓冲区结构体

/*
*********************************************************************************************************
* 函 数 名:   BSP_UART_Init
* 功能说明:   初始化串口外设的设备句柄，HAL层驱动已经在Cubemx初始化
* 形    参:   无
* 返 回 值:   无
*********************************************************************************************************
*/
void BSP_UART_Init(void)
{
  //---> uart2
  //  step1:参数初始化
  g_tUart2.tpUart       = &huart2;
  g_tUart2.tpDmaTx      = &hdma_usart2_tx;
  g_tUart2.tpDmaRx      = &hdma_usart2_rx;
  g_tUart2.tpTxBuf      = &BufTx2;
  g_tUart2.tpRxBuf      = &BufRx2;

  CLEAR_FLAG(g_tUart2.state, UART_RX_DONE);   //  清除接收
  SET_FLAG(g_tUart2.state, UART_TX_DONE);     //  标记发送可用
  
  //  step2:启动接收
  HAL_UARTEx_ReceiveToIdle_DMA(g_tUart2.tpUart,g_tUart2.tpRxBuf->data,g_tUart2.tpRxBuf->size);
  __HAL_DMA_DISABLE_IT(g_tUart2.tpDmaRx, DMA_IT_HT);    //  关闭DMA半中断
  
  //---> uart4
  //  step1:参数初始化
  g_tUart4.tpUart       = &huart4;
  g_tUart4.tpDmaTx      = &hdma_uart4_tx;
  g_tUart4.tpDmaRx      = &hdma_uart4_rx;
  g_tUart4.tpTxBuf      = &BufTx4;
  g_tUart4.tpRxBuf      = &BufRx4;
  
  CLEAR_FLAG(g_tUart4.state, UART_RX_DONE);   //  清除接收
  SET_FLAG(g_tUart4.state, UART_TX_DONE);     //  标记发送可用
  
  //  step2:启动接收
  HAL_UARTEx_ReceiveToIdle_DMA(g_tUart4.tpUart,g_tUart4.tpRxBuf->data,g_tUart4.tpRxBuf->size);
  __HAL_DMA_DISABLE_IT(g_tUart4.tpDmaRx, DMA_IT_HT);    //  关闭DMA半中断
  return;
}

/*
*********************************************************************************************************
* 函 数 名:   BSP_UART_TransmitBuf
* 功能说明:   启动串口传输不需要压入缓存区
* 形    参:   
* 返 回 值:   无
*********************************************************************************************************
*/
void BSP_UART_Transmit(UART_T *hDevUart,u8 *pData,u16 Size)
{
  //  step1:保护机制
  if(hDevUart==NULL || pData==NULL)    return;
    
  //  step2:DMA启动发送
  if(Size>0)                                     //Miaozi:数据存在
  {
    CLEAR_FLAG(hDevUart->state, UART_TX_DONE);   //  标记发送忙
    HAL_UART_Transmit_DMA(hDevUart->tpUart,pData,Size);    //  调用HAL层驱动
  }

  return;
}

/*
*********************************************************************************************************
* 函 数 名:   BSP_UART_TransmitBuf
* 功能说明:   压入数据放到缓存区，启动DMA，由DMA在后台完成发送。
* 形    参:   
* 返 回 值:   无
*********************************************************************************************************
*/
void BSP_UART_TransmitBuf(UART_T *hDevUart,u8 *pData,u16 Size)
{
  //  step1:保护机制
  if(hDevUart==NULL || pData==NULL)    return;
    
  //  step2:DMA启动发送
  if(BUF_Write(hDevUart->tpTxBuf,pData,Size)) //  如果写入成功
  {
    CLEAR_FLAG(hDevUart->state, UART_TX_DONE);   //  标记发送忙
    HAL_UART_Transmit_DMA(hDevUart->tpUart,hDevUart->tpTxBuf->data,hDevUart->tpTxBuf->length);    //  调用HAL层驱动
  }

  return;
}

extern void LITE_AT_RxHandler(UART_HandleTypeDef *huart,u16 Size);    //Miaozi：AT接收中断
extern void LITE_LOG_RxHandler(UART_HandleTypeDef *huart,u16 Size);   //Miaozi：日志接收中断
/*
*********************************************************************************************************
* 函 数 名:   HAL_UARTEx_RxEventCallback
* 功能说明:   串口接收完成回调函数
* 形    参  :   
* 返 回 值:   无
*********************************************************************************************************
*/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{  
  LITE_AT_RxHandler(huart,Size);    //Miaozi：网络串口
  LITE_LOG_RxHandler(huart,Size);   //Miaozi：日志串口
  return;
}

//  日志输出中断服务函数
extern void LITE_LOG_TxHandler(UART_HandleTypeDef *huart);
//  AT输出中断函数
extern void LITE_AT_TxHandler(UART_HandleTypeDef *huart);
/*
*********************************************************************************************************
* 函 数 名:   HAL_UART_TxCpltCallback
* 功能说明:   串口发送完成回调函数
* 形    参:   
* 返 回 值:   无
*********************************************************************************************************
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  LITE_AT_TxHandler(huart);
  LITE_LOG_TxHandler(huart);   
  return;
}
/***************************** LiteBsp by Miaozi (END OF FILE) *********************************/
